package com.hykc.auth.common;


import org.apache.shiro.crypto.hash.Md5Hash;

import java.security.MessageDigest;

/**
 * @Description:
 * @Company:		http://java.itcast.cn
 * @CreateDate:		2014年12月27日
 */
public class Encrypt {
	/*
	 * 散列算法一般用于生成数据的摘要信息，是一种不可逆的算法，一般适合存储密码之类的数据，
	 * 常见的散列算法如MD5、SHA等。一般进行散列时最好提供一个salt（盐），比如加密密码“admin”，
	 * 产生的散列值是“21232f297a57a5a743894a0e4a801fc3”，
	 * 可以到一些md5解密网站很容易的通过散列值得到密码“admin”，
	 * 即如果直接对密码进行散列相对来说破解更容易，此时我们可以加一些只有系统知道的干扰数据，
	 * 如用户名和ID（即盐）；这样散列的对象是“密码+用户名+ID”，这样生成的散列值相对来说更难破解。
	 */

	//高强度加密算法,不可逆
	public static String md5(String password, String salt){
		return new Md5Hash(password,salt,2).toString();
	}

	/**
	 * 十六进制下数字到字符的映射数组
	 */
	private final static String[] HEX_DIGITS = {"0", "1", "2", "3", "4",
			"5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

	/**
	 * md5加密算法
	 * @param  originString 待加密字符串
	 * @return 加密后的字符串
	 */
	public static String encodeByMD5(String originString){
		if (originString != null){
			try{
				//创建具有指定算法名称的信息摘要
				MessageDigest md = MessageDigest.getInstance("MD5");
				//使用指定的字节数组对摘要进行最后更新，然后完成摘要计算
				byte[] results = md.digest(originString.getBytes());
				//将得到的字节数组变成字符串返回
				String resultString = byteArrayToHexString(results);
				return resultString.toUpperCase();
			} catch(Exception ex){
				ex.printStackTrace();
			}
		}
		return null;
	}

	/**
	 * 转换字节数组为十六进制字符串
	 * @param
	 * @return    十六进制字符串
	 */
	private static String byteArrayToHexString(byte[] b){
		StringBuilder resultSb = new StringBuilder();
		for (byte aB : b) {
			resultSb.append(byteToHexString(aB));
		}
		return resultSb.toString();
	}

	/** 将一个字节转化成十六进制形式的字符串     */
	private static String byteToHexString(byte b){
		int n = b;
		if (n < 0) {
			n = 256 + n;
		}
		int d1 = n / 16;
		int d2 = n % 16;
		return HEX_DIGITS[d1] + HEX_DIGITS[d2];
	}
	public static void main(String[] args) {
		System.out.println(new Md5Hash("123456","lw@export.com",2).toString());
	}

}
